Generador de frecuencia cuadrada.
Usaremos el Timer1 para generar la frecuencia a traves del pin PB1(OC1A)
En este ejemplo generamos una frecuencia de 440Hz
Para calcular el OCR1A lo hacemos con:
(CPU_CLOCK / PREESCALER) / FRECUENCIA_FINAL / 2
En este caso seria (1000000 / 8) / 440 / 2, que nos da aproximadamente 142
(Cuando queremos generar frecuencias muy especificas es muy dificil que el calculo final sea 100% exacto, y para el comparador necesitamos un numero entero, por eso simplemente redondeamos y listo).
La división entre 2 al final es porque el timer hace un toggle del pin, por lo tanto para que haga la frecuencia completa tiene que activar y desactivar la salida por lo tanto para alcanzar la frecuencia que queremos tenemos que hacer que sea el doble de rapido, por eso se divide entre 2.
Podemos usar la señal cuadrada generada para enviarla a un altavoz y así escucharla, en este caso a traves de PB1(OC1A).
El condensador conectado al altavoz actua como un acoplador, haciendo que el altavoz perciba el cambio de frecuencia de manera mas amortiguada, al usar el condensador la señal queda centrada en 0V.
#include <avr/io.h>
void timer1_init() {
TCCR1B |= (1 << WGM12); // Modo CTC
TCCR1B |= (1 << CS11); // Prescaler 8
TCCR1A |= (1 << COM1A0); // Pin toggle en PB1
OCR1A = 142;
}
int main(void) {
DDRB |= (1 << PB1); // PB1 como salida
timer1_init(); // Inicializar Timer1
while (1) {
}
}
AVR | PWM | Generador | frecuencia